package luo.utils;


import io.jsonwebtoken.*;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: token工具类
 * @Author:let_free
 * @Date:2024/10/3/13:31
 **/
public class TokenUtils {
    private static final String SECRET_KEY = "Shijiazhuang"; // 使用一个安全的密钥

    /**
     * @param username
     * @return java.lang.String
     * @description 传入username生成token
     * @author let_free
     * @date 2024/10/3 13:58
     */
    public static String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username);
    }

    /**
     * @param claims
     * @param subject
     * @return java.lang.String
     * @description 生成token  同时设置过期时间
     * @author let_free
     * @date 2024/10/3 13:59
     */
    private static String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder().setClaims(claims).setSubject(subject).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();
    }

    /**
     * @param token
     * @return io.jsonwebtoken.Claims
     * @description 验证传入的token是否正确 过期了会返回ExpiredJwtException  token解析失败会传出SignatureException 统一在异常处理中处理
     * @author let_free
     * @date 2024/10/3 14:00
     */

    public static Claims validateToken(String token) {
        try {
            return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
        } catch (JwtException e) {
            throw new SignatureException("非法Token，请重新登录");
        }
    }
}
